package com.tensquareuser.user.interceptor;

import io.jsonwebtoken.Claims;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import util.JwtUtil;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @program: tensquare_parent52
 * @description
 * @author: xu1
 * @create: 2019-12-10 18:50
 **/
//mvc 拦截器，专门写  令牌、权限解析，      解析代码过于累赘 杂多，这个拦截相当于aop，这里代码提取。


//拦截器算 spring mvc的 基本功能，spring boot 只省去了 mvc的 基本配置
//省去的有
// 组件扫描--能创建实体类，开启mvc注解支持--mvc：application那个东西 ，视图解析器，释放静态资源

// 这4个，其他的 文件上传---文件解析器 等等
// 拦截器 也是 需要自己配置的 --配置文件X、配置类
@Component
public class JwtInterceptor implements HandlerInterceptor {
    //写拦截器 实现HandlerInterceptor
    //继承HandlerInterceptorAdapter 它里面都是空方法

    @Autowired
    private JwtUtil jwtUtil;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("经过了拦截器");
        //无论 怎么样都 最终都是放行，具体能不能做具体的操作 比如删除， 要在具体的操作中取判断
        //这个 拦截器只是负责把头请求中包含token的令牌进行一个 信息验证
        //实际作用这个 拦截器 跟个aop 差不多

        String header = request.getHeader("Authorization");
        System.out.println(header);
        if(header!=null&&!"".equals(header)){
            if(header.startsWith("Bearer ")){
                //得到token
                String token = header.substring(7);
                System.out.println(token);
                //对令牌进行验证--验证就要 try catch
                try {
                    Claims claims = jwtUtil.parseJWT(token);
                    String roles = (String) claims.get("roles");
                    System.out.println(roles);
                    if (roles!=null&&roles.equals("admin")) {
                        //解析后把令牌 存进request 域中
                        request.setAttribute("claims_admin", token);
                    }
                    if (roles!=null&&roles.equals("user")) {
                        //解析后把令牌 存进request 域中
                        request.setAttribute("claims_user", token);
                    }
                } catch (Exception e) {
                    throw new RuntimeException("令牌不正确");
                }
            }
        }
        return true;//true 就是放行
    }
}
